#include<iostream>
#include<string>
#include<vector>
#include<cassert>
#include<cstring>
using  std::cout; 
using  std::endl; 
using  std::cin; 

#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

#include"comm.hpp"

Task t;


int ShowBorad()
{
    int command=0;
    cout<<"********************************"<<endl;
    cout<<"*0.打印日志任务 1. 数据库处理任务*"<<endl;
    cout<<"*2.资源请求任务 3. 退出程序     *"<<endl;
    cout<<"********************************"<<endl;
    cout<<"请选择：";
    cin>>command;
    return command;

}


void CreateFifo()
{

    for(const auto& each:t.task)
    {
        int n = mkfifo(each.c_str(), mode);
        if (n != 0)
        {
            std::cout << errno << " : " << strerror(errno) << std::endl;
            exit(1);
        }
    }
    cout<<"创建管道文件成功"<<endl;
}

void DeleteFifo()
{
    for(const auto& each:t.task)
    {
        int ret=unlink(each.c_str());
        assert(ret==0);
        (void)ret;
    }
}

void OpenFifo(std::vector<int>&wfds)
{
    cout<<"开始打开所有的管道文件"<<endl;
    for (const auto &each : t.task)
    {
        cout<<each.c_str()<<endl;
        int rfd = open(each.c_str(), O_WRONLY);
        cout<<"open:"<<each.c_str()<<" success!"<<endl;
        if (rfd < 0)
        {
            std::cout << errno << " : " << strerror(errno) << std::endl;
            exit(2);
        }
        wfds.push_back(rfd);
    }
    cout<<"打开所有管道文件成功"<<endl;
}


void CloseFifo(const std::vector<int>&wfds)
{
    for(auto each:wfds)
    {
        int ret=close(each);
        assert(ret==0);
        (void)ret;
    }
    cout<<"关闭所有管道文件成功"<<endl;
}

void CtrlProcess(std::vector<int>& wfds)
{
    int cnt=0;
    // 2.1 我们可以写成自动化的，也可以搞成交互式的
    while(true)
    {
        //1.选择任务
        int command=ShowBorad();
        if(command==3)break;
        if(!(command>=0&&command<=2))continue;

        int ret=write(wfds[command],"begin",sizeof("begin"));
        assert(ret!=-1);
        (void)ret;

        sleep(1);
    }
}

int main()
{
    umask(0);
    //1. 为每一个任务都创建相应的管道文件
    CreateFifo();

    //2. 以写的方式打开所有的管道文件
    std::vector<int>wfds;
    OpenFifo(wfds);

    //3.开始通信
    CtrlProcess(wfds);

    //4. 关闭所有管道文件
    CloseFifo(wfds);

    //5.删除每一个任务的对应的管道文件
    DeleteFifo();

    return 0;
}
